从源程序到可执行程序

您所在的位置:网站首页 c编译链接 正则替换 从源程序到可执行程序

从源程序到可执行程序

2024-06-20 14:24| 来源: 网络整理| 查看: 265

从源程序到可执行程序 —— C/C++程序编译链接过程

本文最后更新于:2021年5月11日 晚上

# C/C++程序编译链接过程

编译过程

编译过程即从源程序到可执行程序的过程,其分为四个过程:编译(编译预处理、编译、优化),汇编,链接。

为了允许编写程序时按照逻辑关系将其划分开来,C/C编译器支持分离式编译,允许我们把程序分割成到几个文件中去,每个文件独立编译。所以不但可以编译单个源文件,还可以编译和链接多个源文件,也就有了下面这些步骤。C 和 C一样,下面以 C 程序在UNIX系统下的编译过程为例。

①编译预处理:处理以 # 开头的指令;

预处理命令:

gcc -E hello.c -o hello.i

②编译、优化:将源码 .c 文件翻译成 .s 汇编代码;

编译命令:

gcc -S hello.i -o hello.s

③汇编:将汇编代码 .s 翻译成机器指令 .o 文件;

汇编命令:

gcc -c hello.s -o hello.o

④链接:汇编程序生成的目标文件,即 .o 文件,并不会立即执行,因为可能会出现:.c 文件中的函数引用了另一个 .c 文件中定义的符号或者调用了某个库文件中的函数。那链接的目的就是将这些文件对应的目标文件连接成一个整体,从而生成可执行的程序 .exe 文件。

链接命令:

gcc hello.o -o hello.exe

平时编译用的命令 gcc -o hello.o hello.c 相当于①②③步骤命令的“组合拳”。

在UNIX系统下的目标文件的后缀为.o,在windows系统下则为.obj,其含义是文件包含目标代码(object code)

大致流程:

–> .c源程序

– 预处理程序(cpp):阅读源程序,执行预处理指令,嵌入指定源文件(#include头及#define宏替换等),生成新的临时文件

–> .i预处理过的源程序

– 编译程序(ccl):语法分析、语义分析、代码优化、目标代码生成

–> .s汇编源程序

– 汇编程序(as):翻译成机器指令

– > .o可重定位目标程序

– 链接程序(ld):链接多个可重定位目标文件和标准库函数为一个可执行目标文件(可执行文件)

–> .exe可执行目标程序

下面是LeetCode给的流程图示例,感觉挺直观的

leetcode给的流程图示例

链接过程

链接作为编译运行流程中的一个步骤,可以分为两种:

静态链接:代码从其所在的静态链接库中拷贝到最终的可执行程序中,在该程序被执行时,这些代码会被装入到该进程的虚拟地址空间中。 动态链接:代码被放到动态链接库或共享对象的某个目标文件中,链接程序只是在最终的可执行程序中记录了共享对象的名字等一些信息。在程序执行时,动态链接库的全部内容会被映射到运行时相应进行的虚拟地址的空间。 二者的优缺点 静态链接:浪费空间,每个可执行程序都会有目标文件的一个副本,这样如果目标文件进行了更新操作,就需要重新进行编译链接生成可执行程序(更新困难);优点就是执行的时候运行速度快,因为可执行程序具备了程序运行的所有内容。 动态链接:节省内存、更新方便,但是动态链接是在程序运行时,每次执行都需要链接,相比静态链接会有一定的性能损失。

参考资料:

[1]袁春风.计算机组成与系统结构(第2版)[M].清华大学出版社:北京,2015:12. [2]LeetCode.C++ 程序编译过程[EB/OL].https://leetcode-cn.com/leetbook/read/cpp-interview-highlights/e4ns5g/,2021.

编程语言 C/C++ C/C++ 编译原理 CS基础

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

快乐打码之 VS Code 配置代码模板 上一篇 C/C++基础知识回顾 下一篇


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3